﻿/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the tools applications of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPL3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or (at your option) the GNU General
** Public license version 3 or any later version approved by the KDE Free
** Qt Foundation. The licenses are as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-2.0.html and
** https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#ifndef QTVARIANTPROPERTY_H
#define QTVARIANTPROPERTY_H

#include "qtpropertybrowser.h"
#include <QtCore/QVariant>
#include <QtGui/QIcon>

QT_BEGIN_NAMESPACE

typedef QMap<int, QIcon> QtIconMap;

class QtVariantPropertyManager;

class QtVariantProperty : public QtProperty
{
public:
	~QtVariantProperty();
	QVariant value() const;
	QVariant attributeValue(const QString& attribute) const;
	int valueType() const;
	int propertyType() const;

	void setValue(const QVariant& value);
	void setAttribute(const QString& attribute, const QVariant& value);

protected:
	QtVariantProperty(QtVariantPropertyManager* manager);

private:
	friend class QtVariantPropertyManager;
	QScopedPointer<class QtVariantPropertyPrivate> d_ptr;
};

class QtVariantPropertyManager : public QtAbstractPropertyManager
{
	Q_OBJECT
public:
	QtVariantPropertyManager(QObject* parent = 0);
	~QtVariantPropertyManager();

	virtual QtVariantProperty* addProperty(int propertyType, const QString& name = QString());

	int propertyType(const QtProperty* property) const;
	int valueType(const QtProperty* property) const;
	QtVariantProperty* variantProperty(const QtProperty* property) const;

	virtual bool isPropertyTypeSupported(int propertyType) const;
	virtual int valueType(int propertyType) const;
	virtual QStringList attributes(int propertyType) const;
	virtual int attributeType(int propertyType, const QString& attribute) const;

	virtual QVariant value(const QtProperty* property) const;
	virtual QVariant attributeValue(const QtProperty* property, const QString& attribute) const;

	static int enumTypeId();
	static int flagTypeId();
	static int groupTypeId();
	static int iconMapTypeId();
public Q_SLOTS:
	virtual void setValue(QtProperty* property, const QVariant& val);
	virtual void setAttribute(QtProperty* property,
							  const QString& attribute, const QVariant& value);
Q_SIGNALS:
	void valueChanged(QtProperty* property, const QVariant& val);
	void attributeChanged(QtProperty* property,
						  const QString& attribute, const QVariant& val);

protected:
	virtual bool hasValue(const QtProperty* property) const;
	QString valueText(const QtProperty* property) const;
	QIcon valueIcon(const QtProperty* property) const;
	virtual void initializeProperty(QtProperty* property);
	virtual void uninitializeProperty(QtProperty* property);
	virtual QtProperty* createProperty();

private:
	QScopedPointer<class QtVariantPropertyManagerPrivate> d_ptr;
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, int))
	Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty*, int, int))
	Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty*, int))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, double))
	Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty*, double, double))
	Q_PRIVATE_SLOT(d_func(), void slotSingleStepChanged(QtProperty*, double))
	Q_PRIVATE_SLOT(d_func(), void slotDecimalsChanged(QtProperty*, int))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, bool))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QString&))
	Q_PRIVATE_SLOT(d_func(), void slotRegExpChanged(QtProperty*, const QRegExp&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QDate&))
	Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty*, const QDate&, const QDate&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QTime&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QDateTime&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QKeySequence&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QChar&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QLocale&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QPoint&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QPointF&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QSize&))
	Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty*, const QSize&, const QSize&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QSizeF&))
	Q_PRIVATE_SLOT(d_func(), void slotRangeChanged(QtProperty*, const QSizeF&, const QSizeF&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QRect&))
	Q_PRIVATE_SLOT(d_func(), void slotConstraintChanged(QtProperty*, const QRect&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QRectF&))
	Q_PRIVATE_SLOT(d_func(), void slotConstraintChanged(QtProperty*, const QRectF&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QColor&))
	Q_PRIVATE_SLOT(d_func(), void slotEnumNamesChanged(QtProperty*, const QStringList&))
	Q_PRIVATE_SLOT(d_func(), void slotEnumIconsChanged(QtProperty*, const QMap<int, QIcon>&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QSizePolicy&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QFont&))
	Q_PRIVATE_SLOT(d_func(), void slotValueChanged(QtProperty*, const QCursor&))
	Q_PRIVATE_SLOT(d_func(), void slotFlagNamesChanged(QtProperty*, const QStringList&))

	Q_PRIVATE_SLOT(d_func(), void slotPropertyInserted(QtProperty*, QtProperty*, QtProperty*))
	Q_PRIVATE_SLOT(d_func(), void slotPropertyRemoved(QtProperty*, QtProperty*))
	Q_DECLARE_PRIVATE(QtVariantPropertyManager)
	Q_DISABLE_COPY_MOVE(QtVariantPropertyManager)
};

class QtVariantEditorFactory : public QtAbstractEditorFactory<QtVariantPropertyManager>
{
	Q_OBJECT
public:
	QtVariantEditorFactory(QObject* parent = 0);
	~QtVariantEditorFactory();

protected:
	void connectPropertyManager(QtVariantPropertyManager* manager);
	QWidget* createEditor(QtVariantPropertyManager* manager, QtProperty* property,
						  QWidget* parent);
	void disconnectPropertyManager(QtVariantPropertyManager* manager);

private:
	QScopedPointer<class QtVariantEditorFactoryPrivate> d_ptr;
	Q_DECLARE_PRIVATE(QtVariantEditorFactory)
	Q_DISABLE_COPY_MOVE(QtVariantEditorFactory)
};

QT_END_NAMESPACE

Q_DECLARE_METATYPE(QIcon)
Q_DECLARE_METATYPE(QtIconMap)
#endif
